home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / ldpcx04 / ldpcx04s.lzh / LDPCX4.S < prev    next >
Text File  |  1997-07-23  |  12KB  |  540 lines

  1. *****************************************************************
  2. *    16色のPCX                        *
  3. *****************************************************************
  4.     .include    doscall.mac
  5.     .include    iocscall.mac
  6.     .include    myconst.h
  7.  
  8.     .xdef    _pcx4_prt
  9.     .xdef    _pcx4_scroll
  10.  
  11.     .xref    key_chk
  12.     .xref    tenkey_chk
  13.     .xref    cursor_chk
  14.     .xref    mouse_chk
  15.  
  16.     .xref    x_set
  17.     .xref    y_set
  18.     .xref    v_wait
  19.     .xref    inf_change
  20.  
  21.     .xref    tate
  22.     .xref    yoko
  23.     .xref    crt_y
  24.     .xref    x_max
  25.     .xref    y_max
  26.     .xref    x_pos
  27.     .xref    y_pos
  28.     .xref    gr_addr
  29.     .xref    kflg
  30.     .xref    esc_flg
  31.     .xref    next_flg
  32.     .xref    scroll_key
  33.     .xref    s_dot4
  34.  
  35.     .text
  36.     .even
  37.  
  38. *****************************************************************
  39. *    16色表示                        *
  40. *****************************************************************
  41. _pcx4_prt:
  42.     bsr    pcx4_prt
  43.     rts
  44.  
  45. *****************************************************************
  46. *    スクロール                        *
  47. *****************************************************************
  48. _pcx4_scroll:
  49.     bsr    scroll
  50.     rts
  51.  
  52. *****************************************************************
  53. *    表示                            *
  54. *****************************************************************
  55. pcx4_prt:
  56.     move.w    x_pos(pc),d0        *表示先画像アドレス
  57.     move.w    y_pos(pc),d1
  58.     swap.w    d1
  59.     clr.w    d1
  60.     ror.l    #5,d1
  61.     add.w    d0,d0
  62.     add.w    d0,d1
  63.     movea.l    d1,a2
  64.     adda.l    #GRAM,a2
  65.  
  66.     movea.l    gr_addr(pc),a1        *表示もとアドレス
  67.  
  68.     move.w    yoko(pc),d0        *横ライン数
  69.     cmp.w    #1024,d0
  70.     bcs    pcx4_prt0
  71.     move.w    #1024,d0
  72.  
  73. pcx4_prt0:
  74.     move.w    tate(pc),d2        *縦ライン数
  75.     cmp.w    #1024,d2
  76.     bcs    pcx4_prt1
  77.     move.w    #1024,d2
  78. pcx4_prt1:
  79. **    move.w    d2,d7
  80. **    sub.w    crt_y(pc),d7        *自動スクロール用
  81.  
  82. *    move.w    yoko(pc),d1        *表示元データの1ライン下へのバイト数
  83. *    addq.w    #1,d1
  84. *    sub.w    d0,d1
  85. *    lsr.w    #1,d1
  86. *    movea.w    d1,a3
  87.  
  88.     move.w    yoko(pc),d1        *表示元データの1ライン下へのバイト数
  89.     addq.w    #7,d1
  90.     and.w    #$fff8,d1
  91.     sub.w    d0,d1
  92.     lsr.w    #1,d1
  93.     movea.w    d1,a3
  94.  
  95.     move.w    #1024,d1        *表示先データの1ライン下までのバイト数
  96.     sub.w    d0,d1
  97.     add.w    d1,d1
  98.     movea.w    d1,a4
  99.  
  100.     cmpi.b    #MC68060,MPUTYPE
  101.     bcc    pcx4_prt1_
  102.  
  103.     move.w    d0,d1            *横ドットが16で割り切れるか
  104.     andi.w    #$000f,d1
  105.     beq    pcx4_16            *そう
  106.  
  107. pcx4_prt1_:
  108.     btst.l    #0,d0            *横ドットが偶数か?
  109.     bne    pcx4_prt4        *ちがう
  110.  
  111.     subq.w    #1,d2            *縦-1
  112.     lsr.w    #1,d0            *横/2-1
  113.     subq.w    #1,d0
  114. pcx4_prt2:                *横ドットが偶数の時
  115.     move.w    d0,d1            *横ループ
  116. pcx4_prt3
  117.     move.b    (a1)+,d3
  118.     move.b    d3,d4
  119.  
  120.     lsr.b    #4,d3            *上位4ビットを変換
  121.     move.w    d3,(a2)+
  122.  
  123.     move.w    d4,(a2)+        *下位4ビットを変換
  124.     dbra.w    d1,pcx4_prt3
  125.  
  126.     adda.l    a3,a1            *変換元アドレス更新
  127.     adda.l    a4,a2            *変換先アドレス更新
  128. **    move.w    d7,d3
  129. **    sub.w    d2,d3
  130. **    bmi    pcx4_prt3_
  131. **    move.w    d3,$e8001a        *スクロール
  132. **pcx4_prt3_
  133.     dbra.w    d2,pcx4_prt2
  134.     rts
  135.  
  136. pcx4_prt4:                *横ドット数が奇数の時
  137.     subq.w    #1,d2            *縦-1
  138.     lsr.w    #1,d0            *横/2-1
  139.     subq.w    #1,d0
  140. pcx4_prt5
  141.     move.w    d0,d1            *横ループ
  142. pcx4_prt6
  143.     move.b    (a1)+,d3
  144.     move.b    d3,d4
  145.  
  146.     lsr.b    #4,d3            *上位4ビットを変換
  147.     move.w    d3,(a2)+
  148.  
  149.     move.w    d4,(a2)+        *下位4ビットを変換
  150.     dbra    d1,pcx4_prt6
  151.  
  152.     move.b    (a1)+,d3        *上位4ビットのみ変換
  153.     lsr.b    #4,d3
  154.     move.w    d3,(a2)+
  155.  
  156.     adda.l    a3,a1            *変換元アドレス更新
  157.     adda.l    a4,a2            *変換先アドレス更新
  158. **    move.w    d7,d3
  159. **    sub.w    d2,d3
  160. **    bmi    pcx4_prt6_
  161. **    move.w    d3,$e8001a        *スクロール
  162. **pcx4_prt6_
  163.     dbra.w    d2,pcx4_prt5
  164.     rts
  165.  
  166. pcx4_16:                *横ドット数が16で割り切れる時
  167.     lea.l    -16(sp),sp        *ワークバッファ
  168.     subq.w    #1,d2            *縦-1
  169.     lsr.w    #4,d0            *横/16-1
  170.     subq.w    #1,d0
  171.  
  172. pcx4_16_0:
  173.     move.w    d0,d1            *横ループ
  174. pcx4_16_1:
  175.     move.l    (a1)+,d3
  176.     movep.l    d3,1(sp)
  177.     ror.l    #4,d3
  178.     movep.l    d3,(sp)
  179.  
  180.     move.l    (a1)+,d3
  181.     movep.l    d3,9(sp)
  182.     ror.l    #4,d3
  183.     movep.l    d3,8(sp)
  184.  
  185.     movem.l    (sp),d3-d6
  186.     movep.l    d3,1(a2)
  187.     movep.l    d4,9(a2)
  188.     movep.l    d5,17(a2)
  189.     movep.l    d6,25(a2)
  190.  
  191.     lea.l    32(a2),a2
  192.     dbra.w    d1,pcx4_16_1
  193.  
  194. pcx4_16_2:
  195.     suba.l    a3,a1            *変換元アドレス更新
  196.     adda.l    a4,a2            *変換先アドレス更新
  197. **    move.w    d7,d3
  198. **    sub.w    d2,d3
  199. **    bmi    pcx4_16_2_
  200. **    move.w    d3,$e8001a        *スクロール
  201. **pcx4_16_2_
  202.     dbra.w    d2,pcx4_16_0
  203.     lea.l    16(sp),sp        *戻す
  204.     rts
  205.  
  206. *****************************************************************
  207. *    スクロール制御                        *
  208. *****************************************************************
  209. scroll:
  210.     moveq.l    #0,d2            *スクロール座標初期化
  211.     moveq.l    #0,d3
  212. **    move.w    y_max(pc),d3
  213.     move.w    d2,x_old
  214.     move.w    d3,y_old
  215.  
  216.     bsr    down_demo
  217.     bsr    right_demo
  218.  
  219.     tst.b    kflg            *キー入力待ち
  220.     beq    scroll8            *指定無し
  221. scroll2:
  222.     bsr    key_chk            *キー入力チェック
  223.  
  224.     tst.b    esc_flg            *エスケープ入力有るか
  225.     bne    scroll9            *指定有り
  226.     tst.b    next_flg        *ネクスト入力有るか
  227.     bne    scroll9            *指定有り
  228.  
  229.     bsr    cursor_chk        *カーソルキーからの入力チェック
  230.     bsr    tenkey_chk        *テンキーからの入力チェック
  231.     bsr    scroll_set16        *
  232.     bsr    mouse_chk4        *マウスからの入力チェック
  233.     bsr    lim_chk            *範囲チェック
  234.     bsr    go_scroll        *スクロール実行
  235.     bra    scroll2            *キー入力に戻る
  236.  
  237. scroll8:
  238.     bsr    key_chk            *ESCくらいは入力チェック
  239.     bsr    mouse_chk4        *
  240. scroll9:
  241.     rts
  242.  
  243. *****************************************************************
  244. *    下方向へ全画面スクロールを行う                *
  245. *****************************************************************
  246. down_demo:
  247.     tst.w    y_max
  248.     beq    down_demo9
  249.  
  250.     move.w    s_dot4(pc),-(sp)
  251.     lsr.w    s_dot4
  252. down_demo0:
  253.     bsr    key_chk
  254.     bsr    cursor_chk
  255.     bsr    tenkey_chk
  256.     bsr    mouse_chk
  257.     tst.b    scroll_key
  258.     bne    down_demo8
  259.     tst.b    esc_flg
  260.     bne    down_demo8
  261.     tst.b    next_flg
  262.     bne    down_demo8
  263.  
  264.     bsr    go_scroll
  265.     add.w    s_dot4(pc),d3        *スクロール速度
  266.     cmp.w    y_max(pc),d3
  267.     bls    down_demo0
  268.     move.w    y_max(pc),d3
  269.     bsr    go_scroll
  270. down_demo8:
  271.     move.w    (sp)+,s_dot4
  272. down_demo9:
  273.     rts
  274.  
  275. *****************************************************************
  276. *    右方向へ全画面スクロールを行う                *
  277. *****************************************************************
  278. right_demo:
  279.     tst.w    x_max
  280.     beq    right_demo9
  281.     tst.w    d3
  282.     bne    right_demo9
  283. *    move.w    y_max(pc),d0
  284. *    cmp.w    x_max(pc),d0
  285. *    bhi    right_demo9
  286.  
  287.     move.w    s_dot4(pc),-(sp)
  288.     lsr.w    s_dot4
  289. right_demo0:
  290.     bsr    key_chk
  291.     bsr    cursor_chk
  292.     bsr    tenkey_chk
  293.     bsr    mouse_chk
  294.     tst.b    scroll_key
  295.     bne    right_demo8
  296.     tst.b    esc_flg
  297.     bne    right_demo8
  298.     tst.b    next_flg
  299.     bne    right_demo8
  300.  
  301.     bsr    go_scroll
  302.     add.w    s_dot4(pc),d2        *スクロール速度
  303.     cmp.w    x_max(pc),d2
  304.     bls    right_demo0
  305.     move.w    x_max(pc),d2
  306.     bsr    go_scroll
  307. right_demo8:
  308.     move.w    (sp)+,s_dot4
  309. right_demo9:
  310.     rts
  311.  
  312. *****************************************************************
  313. *    スクロール                        *
  314. *****************************************************************
  315. scroll_set16:
  316.     moveq.l    #0,d0
  317.     move.b    scroll_key(pc),d0
  318.     add.w    d0,d0
  319.     add.w    d0,d0
  320.     movea.l    scroll_tbl(pc,d0.w),a0
  321.     jsr    (a0)
  322.     rts
  323.  
  324. scroll_tbl:
  325.     .dc.l    null            *0000    入力無し
  326.     .dc.l    left            *0001    左
  327.     .dc.l    up            *0010    上
  328.     .dc.l    left_up            *0011    上左
  329.     .dc.l    right            *0100    右
  330.     .dc.l    null            *0101    右左
  331.     .dc.l    right_up        *0110    右上
  332.     .dc.l    up            *0111    右上左
  333.     .dc.l    down            *1000    下
  334.     .dc.l    left_down        *1001    下左
  335.     .dc.l    null            *1010    下上
  336.     .dc.l    left            *1011    下上左
  337.     .dc.l    right_down        *1100    下右
  338.     .dc.l    down            *1101    下右左
  339.     .dc.l    right            *1110    下右上
  340.     .dc.l    null            *1111    下右上左
  341.     .even
  342.  
  343. *****************************************************************
  344. *    入力無し                        *
  345. *****************************************************************
  346. null:
  347.     rts
  348.  
  349. *****************************************************************
  350. *    上へ                            *
  351. *****************************************************************
  352. up:
  353.     sub.w    s_dot4(pc),d3
  354.     rts
  355.  
  356. *****************************************************************
  357. *    右上へ                            *
  358. *****************************************************************
  359. right_up:
  360.     add.w    s_dot4(pc),d2
  361.     sub.w    s_dot4(pc),d3
  362.     rts
  363.  
  364. *****************************************************************
  365. *    右へ                            *
  366. *****************************************************************
  367. right:
  368.     add.w    s_dot4(pc),d2
  369.     rts
  370.  
  371. *****************************************************************
  372. *    右下へ                            *
  373. *****************************************************************
  374. right_down:
  375.     add.w    s_dot4(pc),d2
  376.     add.w    s_dot4(pc),d3
  377.     rts
  378.  
  379. *****************************************************************
  380. *    下へ                            *
  381. *****************************************************************
  382. down:
  383.     add.w    s_dot4(pc),d3
  384.     rts
  385.  
  386. *****************************************************************
  387. *    左下へ                            *
  388. *****************************************************************
  389. left_down:
  390.     sub.w    s_dot4(pc),d2
  391.     add.w    s_dot4(pc),d3
  392.     rts
  393.  
  394. *****************************************************************
  395. *    左へ                            *
  396. *****************************************************************
  397. left:
  398.     sub.w    s_dot4(pc),d2
  399.     rts
  400.  
  401. *****************************************************************
  402. *    左上へ                            *
  403. *****************************************************************
  404. left_up:
  405.     sub.w    s_dot4(pc),d2
  406.     sub.w    s_dot4(pc),d3
  407.     rts
  408.  
  409. *****************************************************************
  410. *    マウスからの入力をチェックする                *
  411. *****************************************************************
  412. mouse_chk4:
  413.     IOCS    _MS_GETDT        *マウスからのデータをGET
  414.  
  415.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  416.     beq    mouse_right        *押された
  417.     andi.w    #$ff00,d0        *左ボタンが押されたか
  418.     bne    mouse_left        *押された
  419.  
  420.     swap    d0
  421.     move.w    d0,d1
  422.     andi.w    #$ff00,d0
  423.     andi.w    #$00ff,d1
  424.     ror.l    #8,d0
  425.  
  426. ms_x_chk:                *X方向の移動量を調べる
  427.     tst.b    d0
  428.     beq    ms_y_chk
  429.     blt    ms_xm            *移動量がマイナスの時飛ぶ
  430.     cmp.b    #2,d0
  431.     bls    ms_x_chk2
  432.     subq.b    #1,d0
  433.     add.b    d0,d0            *移動量を二倍にする
  434. ms_x_chk2:
  435.     add.w    d0,d2            *移動量を加算する
  436.     bra    ms_y_chk
  437. ms_xm:                    *移動量がマイナスのとき
  438.     neg.b    d0            *移動量をプラスにする
  439.     cmp.b    #2,d0
  440.     bls    ms_xm2
  441.     subq.b    #1,d0
  442.     add.b    d0,d0            *移動量を二倍にする
  443. ms_xm2:
  444.     sub.w    d0,d2            *移動量を減算する
  445.  
  446. ms_y_chk:                *Y方向の移動量を調べる
  447.     tst.b    d1
  448.     beq    mouse_chk_end
  449.     blt    ms_ym            *移動量がマイナスの時飛ぶ
  450.     cmp.b    #2,d1
  451.     bls    ms_y_chk2
  452.     subq.b    #1,d1
  453.     add.b    d1,d1            *移動量を二倍にする
  454. ms_y_chk2:
  455.     add.w    d1,d3            *移動量を加算する
  456.     bra    mouse_chk_end
  457. ms_ym:                    *移動量がマイナスのとき
  458.     neg.b    d1            *移動量をプラスにする
  459.     cmp.b    #2,d1
  460.     bls    ms_ym2
  461.     subq.b    #1,d1
  462.     add.b    d1,d1            *移動量を二倍にする
  463. ms_ym2:
  464.     sub.w    d1,d3            *移動量を減算する
  465. mouse_chk_end:
  466.     rts
  467.  
  468. mouse_right:
  469.     andi.w    #$ff00,d0        *更に左ボタンが押されたか
  470.     bne    mouse_right1        *押された
  471.     bsr    inf_change        *情報表示の変更
  472. mouse_right0:
  473.     IOCS    _MS_GETDT        *マウスからのデータをGET
  474.     cmpi.b    #$ff,d0            *右ボタンが押されたか
  475.     bne    mouse_right2        *押されいない
  476.     andi.w    #$ff00,d0        *左ボタンが押されたか
  477.     bne    mouse_right1        *押された
  478.     bra    mouse_right0
  479. mouse_right1:
  480.     st    esc_flg            *ESCスイッチON
  481. mouse_right2:
  482.     rts
  483.  
  484. mouse_left:
  485.     st    next_flg        *NEXTスイッチON
  486.     rts
  487.  
  488. *****************************************************************
  489. *    座標の範囲チェックを行う                *
  490. *****************************************************************
  491. lim_chk:            *X座標のチェックを行う
  492.     tst.w    d2
  493.     bge    lim_chk2
  494.     clr.w    d2
  495. lim_chk2:
  496.     cmp.w    x_max(pc),d2
  497.     bls    lim_chk3
  498.     move.w    x_max(pc),d2
  499. lim_chk3:            *Y座標のチェックを行う
  500.     tst.w    d3
  501.     bge    lim_chk4
  502.     clr.w    d3
  503. lim_chk4:
  504.     cmp.w    y_max(pc),d3
  505.     bls    lim_chk5
  506.     move.w    y_max(pc),d3
  507. lim_chk5:
  508.     rts
  509.  
  510. *****************************************************************
  511. *    グラフィック画面のスクロールを行う            *
  512. *****************************************************************
  513. go_scroll:
  514.     bsr    v_wait
  515.     bsr    x_set
  516.     bsr    y_set
  517.     rts
  518.  
  519. *****************************************************************
  520. *    ワークエリア                        *
  521. *****************************************************************
  522.     .bss
  523.     .even
  524.  
  525. gram_x    .ds.w    1            *表示する座標(GRAM)
  526. gram_y    .ds.w    1
  527.  
  528. bmp_x    .ds.w    1            *表示する座標(BMP)
  529. bmp_y    .ds.w    1
  530. bmp_xd    .ds.w    1            *表示するドット数
  531. bmp_yd    .ds.w    1
  532.  
  533. line_byte:
  534.     .ds.w    1            *1ラインのバイト数
  535. x_old:
  536.     .ds.w    1            *前回のX座標
  537. y_old:
  538.     .ds.w    1            *前回のY座標
  539.     .even
  540.